home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / devSCSIRobot.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  15KB  |  393 lines

  1. /*
  2.  * devSCSIRobot.h --
  3.  *
  4.  *     Definitions for the Exabyte EXB-120 robot on the SCSI I/O bus.
  5.  *
  6.  * Copyright 1992 Regents of the University of California
  7.  * All rights reserved.
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/dev/devSCSIRobot.h,v 9.5 92/03/06 15:07:01 mani Exp $ SPRITE (Berkeley)
  17.  */
  18.  
  19. #ifndef _SCSIEXBROBOT
  20. #define _SCSIEXBROBOT
  21.  
  22. #include <dev/robot.h>
  23. #include <scsiDevice.h>
  24.  
  25. typedef struct ScsiExbRobot {
  26.     ScsiDevice    *devPtr;    /* SCSI Device we have attached. */
  27.     int state;            /* State bits used to determine if it's
  28.                  * open, really exists, etc. */
  29.     unsigned int chmAddr;    /* Address of the robot arm itself.*/
  30.     char *name;            /* Type name of robot device. */
  31. } ScsiExbRobot;
  32.  
  33. /*
  34.  * Robot state:
  35.  *    SCSI_ROBOT_CLOSED    The device file is not open.
  36.  *    SCSI_ROBOT_OPEN        The device file is open.
  37.  */
  38. #define SCSI_ROBOT_CLOSED    0x0
  39. #define SCSI_ROBOT_OPEN        0x1
  40.  
  41.  
  42. /*
  43.  * The robot returns 18 bytes of sense.
  44.  */
  45. #define SCSI_EXB_ROBOT_SENSE_LEN    18
  46.  
  47. /*
  48.  * Data Structures pertaining to the SCSI Mode Select command.
  49.  */
  50.  
  51. typedef struct ExbRobotModeSelVendorUnique {
  52. #if BYTE_ORDER == BIG_ENDIAN
  53.     unsigned char reserved    :2;
  54.     unsigned char pageCode    :6;    /* Identifies the vendor unique
  55.                      * parameter list. Must be 0x0. */
  56.     unsigned char paramListLength;    /* Length of the vendor unique
  57.                      * parameter list. It is equal to
  58.                      * 62. */
  59.     unsigned char aInit        :1;    /* 0 == Perform INITIALIZE ELEMENT
  60.                      *      STATUS (0xE7) only when the
  61.                      *      command is issued.
  62.                      * 1 == Perform INITIALIZE ELEMENT
  63.                      *      STATUS after power-up. */
  64.     unsigned char uInit        :1;    /* 0 == Do not perform INIT ELEMENT
  65.                      *      STATUS on a cartridge each time
  66.                      *      it is handled by the CHM.
  67.                      * 1 == Perform INIT ELEMENT STATUS
  68.                      *      each time. */
  69.     unsigned char parity    :1;    /* 0 == Enable SCSI bus parity checking.
  70.                      * 1 == Disable SCSI bus parity checking. */
  71.     unsigned char reserved2    :2;    
  72.     unsigned char notReadyDispCntrl:1;    /* 0 == "Not ready" message
  73.                      *      is flashing.
  74.                      * 1 == Message is steady. */
  75.     unsigned char mesgDispCntrl    :2;    /* Determines how displayMessage
  76.                      * is displayed.
  77.                      * 0 == Flashing 8-char display.
  78.                      * 1 == Steady 8-char display.
  79.                      * 2 == Scrolling display (up to 60 chars). */
  80.     unsigned char reserved3;
  81.     char displayMessage[60];        /* Specifies the ready message that
  82.                      * appears on the operator display when
  83.                      * the robot is ready for operation. */
  84. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  85.     unsigned char pageCode    :6;    /* Identifies the vendor unique
  86.                      * parameter list. Must be 0x0. */
  87.     unsigned char reserved    :2;
  88.  
  89.     unsigned char paramListLength;    /* Length of the vendor unique
  90.                      * parameter list. It is equal to
  91.                      * 62. */
  92.     unsigned char mesgDispCntrl    :2;    /* Determines how displayMessage
  93.                      * is displayed.
  94.                      * 0 == Flashing 8-char display.
  95.                      * 1 == Steady 8-char display.
  96.                      * 2 == Scrolling display (up to 60 chars). */
  97.     unsigned char notReadyDispCntrl    :1;    /* 0 == "Not ready" message
  98.                          *      is flashing.
  99.                          * 1 == Message is steady. */
  100.     unsigned char reserved2    :2;
  101.     unsigned char parity    :1;    /* 0 == Enable SCSI bus parity checking.
  102.                      * 1 == Disable SCSI bus parity checking. */
  103.  
  104.     unsigned char uInit        :1;    /* 0 == Do not perform INIT ELEMENT
  105.                      *      STATUS on a cartridge each time
  106.                      *      it is handled by the CHM.
  107.                      * 1 == Perform INIT ELEMENT STATUS
  108.                      *      each time. */
  109.     unsigned char aInit        :1;    /* 0 == Perform INITIALIZE ELEMENT
  110.                      *      STATUS (0xE7) only when the
  111.                      *      command is issued.
  112.                      * 1 == Perform INITIALIZE ELEMENT
  113.                      *      STATUS after power-up. */
  114.     unsigned char reserved3;
  115.     char displayMessage[60];        /* Specifies the ready message that
  116.                      * appears on the operator display when
  117.                      * the robot is ready for operation. */
  118. #endif
  119. } ExbRobotModeSelVendorUnique;
  120.  
  121.  
  122. typedef struct ExbRobotAddrAssignPg {
  123. #if BYTE_ORDER == BIG_ENDIAN
  124.     unsigned char reserved1    :2;
  125.     unsigned char pageCode    :6;    /* Identifies the element address
  126.                      * assignment parameter list. The
  127.                      * value of this field must by 0x1d
  128.                      * (for exb-120).
  129.                      */
  130. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  131.     unsigned char pageCode    :6;
  132.     unsigned char reserved1    :2;
  133. #endif    
  134.     unsigned char paramListLength;    /* Length of the element address
  135.                      * assignment parameter list. The
  136.                      * valid value for this field is
  137.                      * 0x12, which indicates that there
  138.                      * are an additional 18 bytes of
  139.                      * parameter data that follow this
  140.                      * byte.
  141.                      */
  142.     unsigned char transportElemAddr[2]; /* Address of the transport
  143.                      * mechanism.
  144.                      */
  145.     unsigned char transportElemCount[2];/* Number of such mechanisms. The
  146.                      * EXB-120 only has 1.
  147.                      */
  148.     unsigned char firstStorElemAddr[2];    /* Address of the first tape position. */
  149.     unsigned char storElemCount[2];    /* Number of such elements. */
  150.     unsigned char firstEePortAddr[2];
  151.     unsigned char eePortAddrCount[2];    /* Self-explanatory. */
  152.     unsigned char firstDriveAddr[2];    /* Address of the first data transfer
  153.                      * element (i.e., tape drive).
  154.                      */
  155.     unsigned char driveCount[2];    /* Number of such drives. */
  156.     unsigned char reserved2[2];
  157. } ExbRobotAddrAssignPg;
  158.  
  159.  
  160. typedef struct ExbRobotModeSelectData {
  161.     unsigned char header[4];    /* Reserved */
  162.     ExbRobotModeSelVendorUnique vendorUnique;
  163. } ExbRobotModeSelectData;
  164.  
  165. typedef struct ModeSenseCommand {
  166. #if BYTE_ORDER == BIG_ENDIAN
  167.     unsigned char command;        /* 0x1a for Mode Sense. */
  168.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  169.                      * pass the command. */
  170.     unsigned char reserved    :1;
  171.     unsigned char disableBlkDescrptr:1;    /* Not used on Exabyte EXB-120. */
  172.     unsigned char reserved2    :3;
  173.     unsigned char pageControl    :2;    /* Defines the type of parameters
  174.                      * that are to be returned.
  175.                      * 0 == Current values.
  176.                      * 1 == Values which as changeable.
  177.                      * 2 == Default values.
  178.                      * 3 == Saved values. */
  179.     unsigned char pageCode    :6;    /* Specifies which pages are to be
  180.                      * returned.
  181.                      * 0x1d == Element Address Assgnmt Pg.
  182.                      * 0x1e == Transport Geometry Pg.
  183.                      * 0x1f == Device Capabilities Pg.
  184.                      * 0x0  == Vendor Unique Pg.
  185.                      * 0x3f == All pages (in the above order). */
  186.     unsigned char reserved3;
  187.     unsigned char allocLength;        /* Specifies the maximum length
  188.                      * of the parameter list to be
  189.                      * returned. Max == 112 (0x70). */
  190.     unsigned char vendorUnique    :2;    
  191.     unsigned char reserved4    :4;
  192.     unsigned char flag        :1;    /* Interrupt after linked command. */
  193.     unsigned char link        :1;    /* Another command follows. */
  194. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  195.     unsigned char command;        /* 0x1a for Mode Sense. */
  196.     unsigned char reserved2    :3;
  197.     unsigned char disableBlkDescrptr:1;    /* Not used on Exabyte EXB-120. */    
  198.     unsigned char reserved    :1;
  199.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  200.                      * pass the command. */
  201.     unsigned char pageCode    :6;    /* Specifies which pages are to be
  202.                      * returned.
  203.                      * 0x1d == Element Address Assgnmt Pg.
  204.                      * 0x1e == Transport Geometry Pg.
  205.                      * 0x1f == Device Capabilities Pg.
  206.                      * 0x0  == Vendor Unique Pg.
  207.                      * 0x3f == All pages (in the above order). */
  208.     unsigned char pageControl    :2;    /* Defines the type of parameters
  209.                      * that are to be returned.
  210.                      * 0 == Current values.
  211.                      * 1 == Values which as changeable.
  212.                      * 2 == Default values.
  213.                      * 3 == Saved values. */
  214.     unsigned char reserved3;
  215.     unsigned char allocLength;        /* Specifies the maximum length
  216.                      * of the parameter list to be
  217.                      * returned. Max == 112 (0x70). */
  218.     unsigned char link        :1;    /* Another command follows. */
  219.     unsigned char flag        :1;    /* Interrupt after linked command. */
  220.     unsigned char reserved4    :4;
  221.     unsigned char vendorUnique    :2;
  222. #endif
  223. } ModeSenseCommand;
  224.  
  225.  
  226. typedef struct MoveMediumCommand {
  227. #if BYTE_ORDER == BIG_ENDIAN
  228.     unsigned char command;
  229.     unsigned char unitNumber    :3;
  230.     unsigned char reserved    :5;
  231.     unsigned char transpElemAddr[2];
  232.     unsigned char sourceAddr[2];
  233.     unsigned char destAddr[2];
  234.     unsigned char reserved2[2];
  235.     unsigned char reserved3    :7;
  236.     unsigned char invert    :1;
  237.     unsigned char eePos        :2;
  238.     unsigned char reserved4    :4;
  239.     unsigned char finalBits    :2;     /* These are fixed at 0. */
  240. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  241.     unsigned char command;
  242.     unsigned char reserved    :5;
  243.     unsigned char unitNumber    :3;
  244.     unsigned char transpElemAddr[2];
  245.     unsigned char sourceAddr[2];
  246.     unsigned char destAddr[2];
  247.     unsigned char reserved2[2];
  248.     unsigned char invert    :1;
  249.     unsigned char reserved3    :7;
  250.     unsigned char finalBits    :2;    /* These are fixed at 0. */
  251.     unsigned char reserved4    :4;
  252.     unsigned char eePos        :2;
  253. #endif
  254. } MoveMediumCommand;
  255.  
  256.  
  257. typedef struct PositionRobotCommand {
  258. #if BYTE_ORDER == BIG_ENDIAN
  259.     unsigned char command;
  260.     unsigned char unitNumber        :3;
  261.     unsigned char reserved        :5;
  262.     unsigned char transpElemAddr[2];
  263.     unsigned char destAddr[2];
  264.     unsigned char reserved2[2];
  265.     unsigned char reserved3        :7;
  266.     unsigned char invert        :1;
  267.     unsigned char reserved4;
  268. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  269.     unsigned char command;
  270.     unsigned char reserved        :5;
  271.     unsigned char unitNumber        :3;
  272.     unsigned char transpElemAddr[2];
  273.     unsigned char destAddr[2];
  274.     unsigned char reserved2[2];
  275.     unsigned char invert        :1;
  276.     unsigned char reserved3        :7;
  277.     unsigned char reserved4;
  278. #endif
  279. } PositionRobotCommand;
  280.  
  281. typedef struct ReadElemStatCommand {
  282. #if BYTE_ORDER == BIG_ENDIAN
  283.     unsigned char command;        /* 0xb8 for this Command. */
  284.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  285.                      * pass the command. */
  286.     unsigned char volTag    :1;    /* 0 == don't report volume tag info.
  287.                      * 1 == do report it. */
  288.     unsigned char elemTypeCode    :4;    /* 0 == report all types.
  289.                      * 1 == report transport elements.
  290.                      * 2 == report storage elements.
  291.                      * 3 == report entry/exit elements.
  292.                      * 4 == report data transfer elements. */
  293.     unsigned char startElemAddr[2];    /* Min elem address to report. */
  294.     unsigned char numElements[2];    /* Max number of descriptors to
  295.                      * be transferred. */
  296.     unsigned char reserved1;
  297.     unsigned char allocLength[3];    /* Bytes of space allocated
  298.                      * for data. */
  299.     unsigned char vendorUnique    :2;     /* Vendor Unique bits. */
  300.     unsigned char reserved3    :4;
  301.     unsigned char flag        :1;     /* Interrupt after linked command. */
  302.     unsigned char link        :1;     /* Another command follows. */
  303. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  304.     unsigned char command;        /* 0xb8 for this Command. */
  305.     unsigned char elemTypeCode    :4;    /* 0 == report all types.
  306.                      * 1 == report transport elements.
  307.                      * 2 == report storage elements.
  308.                      * 3 == report entry/exit elements.
  309.                      * 4 == report data transfer elements. */
  310.     unsigned char volTag    :1;    /* 0 == don't report volume tag info.
  311.                      * 1 == do report it. */
  312.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  313.                      * pass the command. */
  314.     unsigned char startElemAddr[2];    /* Min elem address to report. */
  315.     unsigned char numElements[2];    /* Max number of descriptors to
  316.                      * be transferred. */
  317.     unsigned char reserved1;
  318.     unsigned char allocLength[3];    /* Bytes of space allocated
  319.                      * for data. */
  320.     unsigned char link        :1;     /* Another command follows. */
  321.     unsigned char flag        :1;     /* Interrupt after linked command. */
  322.     unsigned char reserved2    :4;
  323.     unsigned char vendorUnique    :2;     /* Vendor Unique bits. */
  324. #endif
  325. } ReadElemStatCommand;
  326.  
  327.  
  328. typedef struct InitElemStatCommand {
  329. #if BYTE_ORDER == BIG_ENDIAN
  330.     unsigned char command;        /* 0xe7 for this Command. */
  331.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  332.                      * pass the command. */
  333.     unsigned char reserved1    :4;    
  334.     unsigned char range        :1;    /* 0 == init all elements.
  335.                      * 1 == init elements specified. */
  336.     unsigned char elemAddr[2];        /* Specifies starting address
  337.                      * of the series of elements
  338.                      * to be scanned. Ignored when
  339.                      * range == 0. */
  340.     unsigned char reserved2[2];    
  341.     unsigned char numElements[2];    /* Maximum number of elements
  342.                      * to be scanned. ignored when
  343.                      * range == 0. */
  344.     unsigned char reserved3[2];
  345. #else /* BYTE_ORDER == LITTLE_ENDIAN */
  346.     unsigned char command;        /* 0xe7 for this Command. */
  347.     unsigned char range        :1;    /* 0 == init all elements.
  348.                      * 1 == init elements specified. */
  349.     unsigned char reserved1    :4;    
  350.     unsigned char unitNumber    :3;    /* Logical Unit Number to which to
  351.                      * pass the command. */
  352.     unsigned char elemAddr[2];        /* Specifies starting address
  353.                      * of the series of elements
  354.                      * to be scanned. Ignored when
  355.                      * range == 0. */
  356.     unsigned char reserved2[2];    
  357.     unsigned char numElements[2];    /* Maximum number of elements
  358.                      * to be scanned. ignored when
  359.                      * range == 0. */
  360.     unsigned char reserved3[2];
  361. #endif
  362. } InitElemStatCommand;
  363.  
  364.  
  365. /* Function Prototypes */
  366.  
  367. extern ReturnStatus DevSCSIExbRobotError _ARGS_((ScsiDevice *devPtr,
  368.      ScsiCmd *scsiCmdPtr));                         
  369. extern ReturnStatus DevSCSIExbRobotOpen _ARGS_((Fs_Device *devicePtr,
  370.      int useFlags, Fs_NotifyToken token, int *flagsPtr));
  371. extern ReturnStatus DevSCSIExbRobotClose _ARGS_((Fs_Device *devicePtr,
  372.      int useFlags, int openCount, int writerCount));
  373. extern ReturnStatus DevSCSIExbRobotIOControl _ARGS_((Fs_Device *devicePtr,
  374.      Fs_IOCParam *ioctlPtr, Fs_IOReply *replyPtr));
  375.  
  376. extern void ExbRobotInitElemStatus _ARGS_((ScsiCmd *scsiRobotCmdPtr,
  377.      Dev_RobotCommand *cmdPtr));
  378. extern void ExbRobotInquiry _ARGS_((ScsiCmd *scsiRobotCmdPtr, 
  379.      ExbRobotInquiryData *inquiryDataPtr));
  380. extern void ExbModeSelect _ARGS_((ScsiCmd *scsiRobotCmdPtr, 
  381.      Dev_RobotCommand *cmdPtr, Address dataPtr,
  382.      unsigned int dataLength));                  
  383. extern void ExbMoveMedium _ARGS_((ScsiCmd *scsiRobotCmdPtr,
  384.      ScsiExbRobot *robotPtr, Dev_RobotCommand *cmdPtr));
  385. extern void ExbPosElem _ARGS_((ScsiCmd *scsiRobotCmdPtr,
  386.      ScsiExbRobot *robotPtr, Dev_RobotCommand *cmdPtr));
  387. extern void ExbPrevRemoval _ARGS_((ScsiCmd *scsiRobotCmdPtr, 
  388.      Dev_RobotCommand *cmdPtr));
  389. extern void ExbReqSense _ARGS_((ScsiCmd *scsiRobotCmdPtr, 
  390.      ExbRobotSenseData *senseDataPtr));
  391.      
  392. #endif /* _SCSIEXBROBOT */
  393.